/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package epul.bdav;

import java.io.Reader;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;

/**
 *
 * @author p0805878
 */
public class LivreDAO {

    private String titreLivre;
    private int idLivre;
    private String titrePartie;
    private String contenu;
    private int membre;
    private String nomMembre;
    private String emailMembre;
    private Connection c;

    LivreDAO(Connection c) {
        this.c = c;
    }

    LivreDAO(Connexion connexion) {
        java.sql.Connection c = null;
        try {
            c = connexion.seConnecterOracle();
        } catch (SQLException ex) {
            Logger.getLogger(LivreDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        this.c = c;
    }

    public Connection getConnection() {
        return c;
    }

    /*
     * Insertion d'une partie
     */
    public void insertion() throws SQLException {
        // Creation de l'objet Statement
        Statement stat = c.createStatement();
        // Obtention du résultat de la requête dans un ResultSet
        String requete =
                "INSERT INTO partie VALUES(100,2,NULL,'Harry Potter','This is Spartaaaaa !')";

        int result = stat.executeUpdate(requete);
        System.out.println(result + " mise(s) a jour effectuee(s) !");

        requete =
                "SELECT * "
                + "FROM partie p "
                + "WHERE id = 100";
        ResultSet result2 = stat.executeQuery(requete);

        // Parcours du résultat et affichage
        while (result2.next()) {
            System.out.println("id : " + result2.getString("id"));
            System.out.println("livre : " + result2.getString("livre"));
            System.out.println("inclus_dans : " + result2.getString("inclus_dans"));
            System.out.println("titre : " + result2.getString("titre"));
            System.out.println("contenu : " + result2.getString("contenu"));
            System.out.println("----------------------------");
            System.out.println();
        }
    }

    /*
     * Renvoie les id des parties composées
     */
    public List<Integer> partiesComposees() throws SQLException {
        List<Integer> partiesComposees = new ArrayList<Integer>();

        // Creation de l'objet Statement
        Statement stat = c.createStatement();
        // Obtention du résultat de la requête dans un ResultSet
        String requete =
                "SELECT id "
                + "FROM partie p1 "
                + "WHERE (SELECT count(inclus_dans) "
                + "FROM PARTIE p2  "
                + "WHERE p1.id = p2.inclus_dans)>1";
        ResultSet result = stat.executeQuery(requete);

        // Parcours du résultat et affichage
        while (result.next()) {
            System.out.println(result.getString("id"));
            partiesComposees.add(Integer.parseInt(result.getString("id")));
            System.out.println("----------------------------");
            System.out.println();
        }
        return partiesComposees;
    }
    /*
     * Ajout d'une partie
     */

    public int ajoute_partie(int livre, int inclus_dans, String titre, String contenu, int premier_auteur) throws SQLException {
        String requete;
        // Creation de l'objet Statement
        Statement stat = c.createStatement();
        // Obtention du résultat de la requête dans un ResultSet
        if (inclus_dans != -1) {
            requete =
                    "declare res number;"
                    + "begin res:=ajoute_partie(" + livre + "," + inclus_dans + ",'" + titre + "','" + contenu + "'," + premier_auteur + ");"
                    + "end;";
        } else {
            requete =
                    "declare res number;"
                    + "begin res:=ajoute_partie(" + livre + ",NULL,'" + titre + "','" + contenu + "'," + premier_auteur + ");"
                    + "end;";
        }
        System.out.println(requete);
        stat.executeQuery(requete);
        return 0;
    }

    /*
     * Ajout d'un livre
     */
    public int ajout_livre(int editeur, String titre) throws SQLException {
        // Creation de l'objet Statement
        Statement stat = c.createStatement();
        // Obtention du résultat de la requête dans un ResultSet
        String requete =
                "declare res number;"
                + "begin res:=ajout_livre(" + editeur + ",'" + titre + "');"
                + "end;";
        System.out.println(requete);
        stat.executeQuery(requete);
        return 0;
    }

    /*
     * Ajout d'un membre
     */
    public int ajout_membre(String nom, String email) throws SQLException {
        String requete;
        // Creation de l'objet Statement
        Statement stat = c.createStatement();
        if (nom.equals("") && email.equals("")) {
            // Obtention du résultat de la requête dans un ResultSet
            requete =
                    "declare res number;"
                    + "begin res:=ajout_membre(NULL,NULL);"
                    + "end;";
        } else {
            requete =
                    "declare res number;"
                    + "begin res:=ajout_membre('" + nom + "','" + email + "');"
                    + "end;";
        }
        stat.executeQuery(requete);
        return 0;
    }

    /*
     * Ajout d'un membre
     */
    public int modifier_membre(int id, String nom, String email) throws SQLException {
        // Creation de l'objet Statement
        Statement stat = c.createStatement();
        // Obtention du résultat de la requête dans un ResultSet
        String requete = "UPDATE MEMBRE "
                + " SET nom='" + nom
                + "', email='" + email
                + "' WHERE id=" + id;

        int result = stat.executeUpdate(requete);
        System.out.println(result + " mise(s) a jour effectuee(s) !");
        return 0;
    }

    public int getIdLivre(String titre) throws SQLException {

        //Creation de l'objet Statement
        Statement stat = c.createStatement();
        // Obtention du résultat de la requête dans un ResultSet
        String requete =
                "SELECT id "
                + "FROM livre "
                + "WHERE titre='" + titre + "'";
        ResultSet result = stat.executeQuery(requete);

        // Parcours du résultat et affichage
        while (result.next()) {
            return (Integer.parseInt(result.getString("id")));
        }
        return -1;
    }

    public int getIdPartie() throws SQLException {

        //Creation de l'objet Statement
        Statement stat = c.createStatement();
        // Obtention du résultat de la requête dans un ResultSet
        String requete =
                "SELECT livre_seq.currval as idPartie FROM DUAL";
        ResultSet result = stat.executeQuery(requete);

        // Parcours du résultat et affichage
        while (result.next()) {
            System.out.println("getId : " + result.getString("idPartie"));
            return (Integer.parseInt(result.getString("idPartie")));
        }
        return -1;
    }

    public int getIdMembre() throws SQLException {

        //Creation de l'objet Statement
        Statement stat = c.createStatement();
        // Obtention du résultat de la requête dans un ResultSet
        String requete =
                "SELECT membre_seq.currval as idMembre FROM DUAL";
        ResultSet result = stat.executeQuery(requete);

        // Parcours du résultat et affichage
        while (result.next()) {
            return (Integer.parseInt(result.getString("idMembre")));
        }
        return -1;
    }

    public javax.xml.transform.Source getLivreXML(long livreId) throws SQLException {

        // Creation de l'objet Statement
        Statement stat = c.createStatement();

        String requete = "SELECT (livre).getClobVal() AS livre FROM liste_livre"
                + " WHERE idlivre=" + livreId;


        ResultSet rs = stat.executeQuery(requete);
        System.out.println("lol");
        if (rs.next()) {

            Reader xmldata = rs.getCharacterStream("livre");
            System.out.println(xmldata.toString());
            return new StreamSource(xmldata);
        } else {
            return null;
        }
    }

    public void importXML(javax.xml.transform.Source la_source) throws TransformerException {
        try {
            javax.xml.transform.Transformer copy = javax.xml.transform.TransformerFactory.newInstance().newTransformer();
            copy.transform(la_source, new javax.xml.transform.sax.SAXResult(new LivreImportHandler(this)));
        } catch (TransformerConfigurationException ex) {
            Logger.getLogger(LivreDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Connection getC() {
        return c;
    }

    public void setC(Connection c) {
        this.c = c;
    }

    public int getMembre() {
        return membre;
    }

    public void setMembre(int membre) {
        this.membre = membre;
    }

    public String getTitreLivre() {
        return titreLivre;
    }

    public void setTitreLivre(String titreLivre) {
        this.titreLivre = titreLivre;
    }

    public String getTitrePartie() {
        return titrePartie;
    }

    public void setTitrePartie(String titrePartie) {
        this.titrePartie = titrePartie;
    }

    public String getContenu() {
        return contenu;
    }

    public void setContenu(String contenu) {
        this.contenu = contenu;
    }

    public int getIdLivre() {
        return idLivre;
    }

    public void setIdLivre(int idLivre) {
        this.idLivre = idLivre;
    }

    public String getEmailMembre() {
        return emailMembre;
    }

    public void setEmailMembre(String emailMembre) {
        this.emailMembre = emailMembre;
    }

    public String getNomMembre() {
        return nomMembre;
    }

    public void setNomMembre(String nomMembre) {
        this.nomMembre = nomMembre;
    }
}
